/* This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
package Modelo;

import java.util.*;


/**
 * Clase que representa un Plugin
 *@author Armando Machuca Llorente
 */
public class Plugin {
	
	private  String _name;
	private String _version;
	private String _so;
	private Vector<Tecnica> _tecnicas;
	private Vector<Accion> _acciones;
	private String _archivoxml;
	
    /**
     * Constructor de la clase parametro
     * @param name Nombre del plugin
     * @param version Version del plugin
     * @param so Sistema operativo para el que esta creado
     */
	public Plugin(String name, String version, String so){
		set_name(name);
		set_version(version);
		set_so(so);
		_tecnicas=new Vector<Tecnica>();
		_acciones=new Vector<Accion>();
	}
	
    /**
     * Constructor de la clase Plugin
     * @param name Nombre del plugin
     */
	public Plugin(String name){
		set_name(name);	
	}
	
	
    /**
     * Metodo que devuelve al conjunto de tecnicas
     * @return Vector de tecnicas
     */
	public Vector getTecnicas(){
		return _tecnicas;
		
	}
	
    /**
     * Metodo que permite anadir una tecnica al conjunto de la tecnicas del plugin
     * @param tec Tecnica a anadir
     */
	public void addTecnica(Tecnica tec){
		_tecnicas.add(tec);
	}
	
    /**
     * MEtodo que devuelve una tecnica concreta del conjunto de las tecnicas
     * @param index indice de la tecnica solicitada
     * @return Tecnica devuelta
     */
	public Tecnica getTecnica(int index){
		return _tecnicas.get(index);
	}
	
    /**
     * Metodo que permite borrar un tecnica
     * @param index Metodo que se quiere borrar dentro del vector de tecnicas
     */
	public void removeTecnica(int index) {
		_tecnicas.remove(index);
	}

    /**
     * Metodo que establece el sistema operativo
     * @param _so Metodo que introduce un sistema operativo para el plugin
     */
	public void set_so(String _so) {
		this._so = _so;
	}

    /**
     * Metodo que devuelve el sistema operativo del plugin
     * @return Sistema operativo del plugin
     */
	public String get_so() {
		return _so;
	}

    /**
     * Metodo que establece la version del plugin
     * @param _version version del plugin
     */
	public void set_version(String _version) {
		this._version = _version;
	}

    /**
     * Metodo que devuelve la version del software buscado en el plugin
     * @return Version del software en el plugin
     */
	public String get_version() {
		return _version;
	}

    /**
     * Metodo que establece el nombre del plugin
     * @param _name Nombre del plugin
     */
	public void set_name(String _name) {
		this._name = _name;
	}

    /**
     * Metodo que devuelve el nombre del plugin
     * @return Nombre del plugin
     */
	public String get_name() {
		return _name;
	}
	
    /**
     * Metodo que imprime por salida estandar el conjunto de tecnicas incluidas en el plugin
     */
	public void printTecnicas(){
		Iterator i = _tecnicas.iterator();
    	while (i.hasNext()){
    	    		Tecnica e= (Tecnica)i.next();
    	    			e.printParams();
    	}
	}

    /**
     * 
     */
	public void set_acciones(Vector<Accion> _acciones) {
		this._acciones = _acciones;
	}

	public Vector<Accion> get_acciones() {
		return _acciones;
	}
	
    /**
     * Metodo que permite introducir una Accion en el conjunto de acciones del plugin
     * @param a Accion que se introduce en el conjunto de las acciones
     */
	public void addAccion(Accion a){
		_acciones.add(a);
		
	}
	
    /**
     * Metodo que imprime por salida estandar el conjunto de acciones
     */
	public void printAcciones(){
		Iterator i = _acciones.iterator();
    	while (i.hasNext()){
    	    		Accion e= (Accion)i.next();
    	    			e.printParams();
    	}
	}
	
    /**
     * Metodo que imprime por salida estandar el conjunto de resultados
     */
	public void printResults(){
		Iterator i = _tecnicas.iterator();
    	while (i.hasNext()){
    		Tecnica e= (Tecnica)i.next();
			e.printResults();
    	}
	}
	
    /**
     * Metodo que devuelve true si se ha encontrado el resultado del plugin
     * @return Boolean que indica si se ha encontrado el software buscado por el plugin
     */
	public boolean encontrado(){
		boolean resu=false;
		Iterator i = _tecnicas.iterator();
    	while (i.hasNext()){
    		Tecnica e= (Tecnica)i.next(); 
    			if(e.getResultado("encontrado").compareTo("true")==0){
				resu=true;
			}
    	}
		return resu;
	}

         /**
     * Metodo que devuelve true si se ha encontrado instalado el programa
     * @return Boolean que indica si se ha encontrado el software buscado por el plugin
     */
	public boolean instalado(){
		boolean resu=false;
		Iterator i = _tecnicas.iterator();
    	while (i.hasNext()){
    		Tecnica e= (Tecnica)i.next();
    			if(e.getResultado("encontrado").compareTo("true")==0){
                            if(e._tipo.equalsIgnoreCase("instalado"))
				resu=true;
			}
    	}
		return resu;
	}


          /**
     * Metodo que devuelve true si se ha encontrado desinstalado el programa
     * @return Boolean que indica si se ha encontrado el software buscado por el plugin
     */
	public boolean desinstalado(){
		boolean resu=false;
		Iterator i = _tecnicas.iterator();
    	while (i.hasNext()){
    		Tecnica e= (Tecnica)i.next();
    			if(e.getResultado("encontrado").compareTo("true")==0){
                            if(e._tipo.equalsIgnoreCase("desinstalado"))
				resu=true;
			}
    	}
		return resu;
	}

    /**
     * 
     */
	public void set_archivoxml(String _archivoxml) {
		this._archivoxml = _archivoxml;
	}

	public String get_archivoxml() {
		return _archivoxml;
	}
	
	
	
	
}
